home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Mania 4
/
MacMania 4.toast
/
/
Demo's
/
Igor Demo Pro
/
3 PutContentsIn Igor Pro Folder
/
Technical Notes
/
Igor Tech Notes
/
TN020-B Peak Areas
/
Peak Areas Folder
/
procedure
< prev
next >
Wrap
Text File
|
1993-09-24
|
25KB
|
1,079 lines
| Peak Areas Experiment V1.3 - 9/24/93
Menu "Macros"
m_so
Submenu m_b
m_bi
m_ba
m_bd
m_bf
m_s
m_bs
End
"-"
Submenu "Identify And Measure Peaks in Steps"
m_ii
"Auto Identify Peaks…/3"
"Ignore Peaks Between Cursors/4"
"Identify Maxima At Cursor A/5"
"Identify Minima At Cursor B/6"
"Construct Baseline From Peaks.../7"
"-"
"Measure Identified Peaks..."
End
"Auto Identify And Measure Peaks..."
"Zoom To Peak.../8"
"-"
Submenu m_a
m_ai
m_aa
m_ala
End
"-"
m_ah
m_cug
m_cw
End
Macro InitializeMostEverything(w,wx,wb)
String w=g_w,wx=g_wx,wb=g_b
Prompt w,p_w,popup, WaveList("*",";","")
Prompt wx,p_wx,popup,calc+WaveList("*X", ";","")
Prompt wb,p_b,popup, none+WaveList("*base*",";","")
Silent 1;PauseUpdate
g_w=w;g_wx=wx; SBs(wb)
Redimension/D $w
SameLen(w,breg);$breg=NaN;SameLen(w,areg);$areg=NaN
Mk(ampsY,2);Mk(ctrsX,2);Mk(widsX,2);Mk(ctrsP,2);Mk(edgsP,4);
Mk(areaNB,2);Mk(areaX1,2);Mk(areaX2,2);
Mk(bdcw,2);Mk(pdcw,2)
if(exists(wx)==1)
Redimension/D$wx
endif
if(exists(wb)==1)
Redimension/D $wb
endif
AppWv(w,wx,"");HideAreaTags()
End
Macro InitBaseLineFit(w,wx)
String w=g_w,wx=g_wx
Prompt w,p_w,popup, WaveList("*",";","")
Prompt wx,p_wx,popup,calc+WaveList("*X", ";","")
Silent 1;PauseUpdate
g_w=w;g_wx=wx
SameLen(w,breg);AppWv(breg,wx,"");Modify mode($breg)=1;$breg=NaN;AppCrs(w)
End
Macro AddRegionToFit()
Silent 1;PauseUpdate
CheckTwoCursors(g_w);$breg[V_start,V_theEnd]=$g_w[p]
End
Macro DeleteRegionFromFit()
Silent 1;PauseUpdate
CheckTwoCursors(g_w);$breg[V_start,V_theEnd]=NaN
End
Macro FitBaselineAtRegions(w,wx,wr,fit)
String w=g_w,wx=g_wx,wr=fbar_wr,fit=fbar_fit
Prompt w,p_w,popup, WaveList("*",";","")
Prompt wx,p_wx,popup,calc+WaveList("*X", ";","")
Prompt wr,"region wave (baseline weighting wave)",popup, none+breg
Prompt fit,"baseline function",popup,S_funcs
Silent 1;PauseUpdate
g_w=w;g_wx=wx;fbar_wr=wr;fbar_fit=fit
ChkLen(w,wx);ChkLen(w,wr)
String ow="W_BaselineFit",wtmp="W_tmp",opts="";SameLen(w,ow)
Variable t=0,typ=floor(strsearch(S_funcs,fit,0)/10)
if(exists(wx)==1)
opts+="/X="+wx
endif
if(exists(wr)==1)
Dup(wr,wtmp)
$wtmp=(numtype($wtmp)==0)
opts+="/W="+wtmp
ar_ex=3
else
ar_ex=1
endif
t=str2num(fit[7,8])-1
String command="CurveFit "+fit[1,7]+", $w"+opts
Execute command
KillWv(wtmp)
Mk(bcw,2);$bcw={NaN,K0,K1,K2,K3,K4};Redimension/N=(2+t) $bcw
Mk(bdcw,2);$bdcw={1,0,numpnts($w)-1,typ,t};Dup(bdcw,"W_PM")
if(exists(wx)==1)
$ow=PolyMorph($bcw,$wx[p])
else
$ow=PolyMorph($bcw,x)
endif
AppWv(ow,wx,"")
SBs(ow)
ar_wfit=ow
End
Macro SubtractBaseline(w,wx,wb,ow)
String w=g_w,wx=g_wx,wb=rb_b,ow=rb_ow
Prompt w,p_w,popup, WaveList("*",";","")
Prompt wx,p_wx,popup,calc+WaveList("*X", ";","")
Prompt wb,p_b,popup, "_From Fit Peaks_;"+WaveList("*base*",";","")
Prompt ow,"output baseline-corrected wave",popup,new+WaveList("*",";","")
Silent 1;PauseUpdate
g_w=w;g_wx=wx
ChkLen(w,wx);ChkLen(w,wb)
String cw,dcw,tcw="W_tmp0",tdcw="W_PM"
if(exists(ow)!=1)
NewWv(w,"NoBase");ow=S_Wave
else
SameLen(w,ow)
endif
rb_ow=ow
if(exists(wb)!=1)
cw=bcw
dcw=bdcw
if(numtype($dcw[1])!=0)
Abort "Run Fit Peaks first!"
endif
Variable terms=$dcw[4],s=$dcw[1],e=$dcw[2],funcs=$dcw[0]
Dup(cw,tcw);Redimension/N=(2+terms) $cw
Dup(dcw,tdcw);$tdcw[0]=1
wb="W_tmp";SameLen(w,wb);$wb=NaN
if(exists(wx)==1)
$wb[s,e]=PolyMorph($tcw,$wx[p])
else
$wb[s,e]=PolyMorph($tcw,x)
endif
endif
$ow=$w-$wb
AppWv(ow,wx,"");Modify zero(left)=1
KillWv(wb);KillWv(tcw)
g_w=ow
SBs("_None_")
End
Macro InitAreaBetweenCursors(what,w,wx,wb,anno)
Variable what=mir_what,anno=mir_anno
String w=g_w,wx=g_wx,wb=g_b
Prompt what,"integration type",popup, mir_pwh
Prompt w,p_wd,popup, WaveList("*",";","")
Prompt wx,p_wx,popup,calc+WaveList("*X", ";","")
Prompt wb,p_b,popup,none+WaveList("*base*", ";","")
Prompt anno,"area annotation",popup,none+"_one tag on graph_;_one tag per peak_"
Silent 1;PauseUpdate
mir_what=what;g_w=w;g_wx=wx;SBs(wb);mir_anno=anno
ChkLen(w,wx);ChkLen(w,wb);AppWv(w,wx,"");AppWv(wb,wx,"")
SameLen(w,areg);AppWv(areg,wx,"");Modify mode($areg)=1;$areg=NaN;AppCrs(w)
HideAreaTags();Mk(areaNB,2);Mk(areaX1,2);Mk(areaX2,2)
End
Macro AreaBetweenCursors()
Silent 1;PauseUpdate
String w=g_w,wx=g_wx,wb=g_b,text,wv=w
CheckTwoCursors(w)
Variable/D s=V_start,en=V_theEnd,wi=0,oi,wlx,wrx
if (mir_anno!=3)
$areg=NaN;HideAreaTags()
endif
$areg[s,en]=$w[p]
iterate (2)
wlx=pnt2x($wv,s);wrx=pnt2x($wv,en)
oi=wi
AreaKind(mir_what,wv,wx,s,en) | outputs V_Area,S_Text
wi=V_Area
Print wv+" "+S_Text+" = "+num2str(wi)
if(exists(wb)!=1)
break
endif
wv=wb
loop
text=S_Text
if(exists(wb)==1)
Print w+" - "+wb+" "+text+" = "+num2str(oi-wi)
wi=oi-wi;text += "\r(less baseline)"
endif
if(mir_anno!=1)
Tag/C/N=$("area"+num2istr(g_atgn))/A=MC $w,(pnt2x($w,s)+pnt2x($w,en))/2, text+"\r= "+num2str(wi)
if(mir_anno==3)
g_atgn+=1
endif
endif
InsertPoints 0,1,$areaNB,$areaX1,$areaX2;$areaNB[0]=wi;$areaX1[0]=V_startX;$areaX2[0]=V_theEndX
Sort $areaX1,$areaX1,$areaX2,$areaNB
End
Macro HideAreaTags()
do
Tag/K/N=$("area"+num2istr(g_atgn))
g_atgn-=1
while (g_atgn>=0)
g_atgn=0
End
Macro ListAreas()
DoWindow/F AreaReportTable
if(V_Flag==0)
AreaReportTable()
endif
End
Macro AutoIdentifyAndMeasurePeaks()
InitIdentifyPeaks()
ShowOnlyDataAndBase()
AutoIdentifyPeaks(2,g_w,g_wx,g_b,g_bx,1)
String kn
if(tfp_pol==1) | positive peaks
kn=wmnp | baseline from neg pks
else
kn=wmxp
endif
ConstructBaselineFromPeaks(g_w,g_wx,kn)
MeasureIdentifiedPeaks(mir_what,pfr_title,pfr_sort,pfr_order,tfp_pol)
End
Macro InitIdentifyPeaks(w,wx,wb,pol,box,what)
String w=g_w,wx=g_wx,wb=g_b
Variable box=g_bx,pol=mpr_pol,what=mir_what
Prompt w,p_w,popup, WaveList("*",";","")
Prompt wx,p_wx,popup,calc+WaveList("*X", ";","")
Prompt wb,p_b,popup, none+WaveList("*base*",";","")
Prompt pol,"peak polarity", popup,"positive;negative"
Prompt box,p_bx
Prompt what,"default integration type",popup, mir_pwh
Silent 1;PauseUpdate
g_w=w;g_wx=wx;SBs(wb)
box=abs(box);mpr_pol=pol;tfp_pol=pol;g_bx=box;mir_what=what
ChkLen(w,wx);ChkLen(w,wb)
SameLen(w,wmnp);SameLen(w,wmxp);$wmnp=NaN;$wmxp=NaN
Mk(ampsY,2);Mk(ctrsX,2);Mk(ctrsP,2);Mk(widsX,2);Mk(edgsP,4)
DoWindow/F PeakFitGraph
if(V_Flag==0)
AppWv(w,wx,"");DoWindow/C PeakFitGraph
else
AppWv(w,wx,"");HideAreaTags()
endif
AppWv(wb,wx,"")
AppCrs(w);SetAxis/A left;SetAxis/A bottom
End
Macro IdentifyMaximaAtCursorA()
if(strlen(CsrWave(A))==0)
Abort "expecting cursor A in target graph on "+g_w+" or similar wave"
endif
if(exists(g_wx)==1)
FindPX(g_w,g_wx,hcsr(A))
$wmxp[V_peakP]=$g_w[V_peakP]
else
$wmxp(hcsr(A))=$g_w(hcsr(A))
endif
End
Macro IdentifyMinimaAtCursorB()
if(strlen(CsrWave(B))==0)
Abort "expecting cursor B in target graph on "+g_w+" or similar wave"
endif
if(exists(g_wx)==1)
FindPX(g_w,g_wx,hcsr(B))
$wmnp[V_peakP]=$g_w[V_peakP]
else
$wmnp(hcsr(B))=$g_w(hcsr(B))
endif
End
Macro IgnorePeaksBetweenCursors()
Silent 1;PauseUpdate
String w=g_w,wx=g_wx,wb=g_b
CheckTwoCursors(g_w)
$wmnp[V_start,V_theEnd]=NaN
$wmxp[V_start,V_theEnd]=NaN
End
| Find min,max peaks by analyzing peak data
Macro AutoIdentifyPeaks(what,w,wx,wb,box,extent)
String w=g_w,wx=g_wx,wb=g_b
Variable what=tfp_what,box=g_bx,extent=tfp_extent
Prompt what,"do what with found peaks?",popup, p_aipw
Prompt w,p_w,popup,WaveList("*", ";","")
Prompt wx,p_wx,popup,calc+WaveList("*X", ";","")
Prompt wb,p_b,popup,none+WaveList("*base*", ";","")
Prompt box,p_bx
Prompt extent,"extent of Y wave to search",popup,"entire wave;between cursors"
Silent 1;PauseUpdate
tfp_what=what;g_w=w;g_wx=wx;SBs(wb)
box=abs(box)
g_bx=box;tfp_extent=extent
ChkLen(w,wx);ChkLen(w,wb)
Variable s=0,en=numpnts($w)-1
if(extent==2) | use cursors
CheckTwoCursors(w);s=V_start;en=V_theEnd
endif
XBoxToPBox(box,w,wx,s,en);box=g_pbox;Print "minima/maxima window is ",box," points..."
String tw="W_tmp"
if(exists(wb)==1)
SameLen(w,tw);$tw[0,s]=NaN;$tw[en,numpnts($tw)-1]=NaN
$tw[s,en]=$w[p]-$wb[p]
w=tw
endif
SameLen(w,wmnp);SameLen(w,wmxp);
if(what==2)
$wmnp=NaN;$wmxp=NaN
endif
| Find min peaks, max peaks
$wmnp[s,en]=IsBestMinMax($wmnp,$w,box/2,p,0) | 1 if local min or max, else 0
$wmxp[s,en]=IsBestMinMax($wmxp,$w,box/2,p,1)
$wmnp[s,en]=$w[p] * sqrt(-1+2*$wmnp[p]) | wave val or NaN
$wmxp[s,en]=$w[p] * sqrt(-1+2*$wmxp[p])
AppWv(wmnp,wx,"");AppWv(wmxp,wx,"")
Modify mode($wmnp)=8,marker($wmnp)=1,mode($wmxp)=3,marker($wmxp)=8
WaveStats/Q/R=[s,en] $wmxp;Print v_npnts," maxima found"
WaveStats/Q/R=[s,en] $wmnp;Print v_npnts," minima found"
KillWv(tw)
End
Function IsBestMinMax(wmm,w,win,pt,doMax)
wave/D wmm,w
Variable win,pt,doMax
Variable isMM=IsLocalMinMax(w,win,pt,doMax)
if(isMM %& (pt > 0))
Variable p1=limit(pt-win,0,pt-1)
if(mean(wmm,pnt2x(wmm,p1),pnt2x(wmm,pt-1))>0) | another min or max already found is too close
isMM=0
endif
endif
return isMM
End
|returns truth that point pt in wave w is local maxima or minima over +/- win points
Function IsLocalMinMax(w,win,pt,doMax)
wave/D w
Variable win,pt,doMax
Variable isMM=1,p=max(0,pt-win),lim=min(numpnts(w)-1,pt+win)
Variable/D mn=w[pt],mx=w[pt]
do
if(doMax)
if(w[p]>mx)
isMM=0
break;
endif
else
if(w[p]<mn)
isMM=0
break;
endif
endif
p+=1
while(p<=lim)
return isMM
End
Macro ConstructBaselineFromPeaks(w,wx,knots)
String w=g_w,wx=g_wx
String knots=cbfp_pol
Prompt w,p_w,popup,WaveList("*", ";","")
Prompt wx,p_wx,popup,calc+WaveList("*X", ";","")
Prompt knots,"peaks to generate baseline from", popup,wmxp+";"+wmnp
Silent 1;PauseUpdate
String wb="W_BaselineFit" | output wave
cbfp_pol=knots;g_w=w;g_wx=wx;SBs(wb)
ChkLen(w,wx);Dup(w,wb);ChkLen(w,knots)
WaveStats/Q $knots
Variable npks,nots=V_npnts
if(nots<2)
Abort "need 2 or more knots in knots wave "+knots
else
Print "using",nots,"knots"
endif
|Create straight line baseline using peaks as knots
if(exists(wx)==1)
npks= KnotsXYToBase($w,$wx,$wb,$knots)
else
npks= KnotsYToBase($w,$wb,$knots)
endif
AppWv(wb,wx,"")
End
| inputs are W_MinKnots and W_MaxKnots
| outputs are
|
| W_PkCenters[i] Final peak center value after baseline correction
| W_PkAmps[i] Final peak amplitude after baseline correction
| W_PkFWHMs[i] Full Width at Half Maximums of the baseline-corrected peaks
| W_PkAreas[i] Areas of the baseline-corrected peaks
| W_PkX1[i] Starting x coordinate of area computation. NEW
| W_PkX2[i] Ending x coordinate of area computation. NEW
| W_PkXwL Starting x coordinate of fwhm (add width to get end x) NEW
Macro MeasureIdentifiedPeaks(what,title,srt,order,pol)
Variable what=mir_what
String title=pfr_title, srt=pfr_sort,
Variable order=pfr_order,pol=tfp_pol
Prompt what,"integration type",popup, mir_pwh
Prompt title,"report title"
Prompt srt,"sort report by",popup,"center;amplitude;width;area"
Prompt order,"sort order",popup,"ascending;descending"
Prompt pol,"peak polarity", popup,"positive;negative"
Silent 1;PauseUpdate
pfr_title=title;pfr_sort=srt;pfr_order=order;tfp_pol=pol;mir_what=what
String center="W_PkCenters",amplitude="W_PkAmps",width="W_PkFWHMs",area="W_PkAreas"
String wx1="W_PkX1",wx2="W_PkX2",fc="W_PkXwL",pkw,bsw
if(pol==1)
pkw=wmxp
bsw=wmnp
else
pkw=wmnp
bsw=wmxp
endif
WaveStats/Q $pkw
Variable npks=V_npnts,np1=npks-1,nrows=max(2,npks)
String text=num2istr(npks)+" peaks"
Mk(center,nrows);Mk(amplitude,nrows);Mk(width,nrows);Mk(area,nrows);
Mk(wx1,nrows);Mk(wx2,nrows);Mk(fc,nrows)
if(npks<1)
Abort "no peaks"
else
print npks," peaks to measure..."
endif
Variable pc=numpnts($pkw),p1,p2,lim=numpnts($bsw)-1
Variable/D m,yb,ab,xd,y0,f1,f2,totalArea=0
Variable ti=ticks
iterate (npks)
pc=PrevNonNaN($pkw,pc) | center of right-most peak
p1=limit(PrevNonNan($bsw,pc),0,lim) | start
p2=limit(NextNonNan($bsw,pc),0,lim) |end
y0=$g_w[pc]
if(exists(g_wx)==1)
$center[i]= $g_wx[pc]
$wx1[i]= $g_wx[p1]
$wx2[i]= $g_wx[p2]
else
$center[i]= pnt2x($g_w,pc)
$wx1[i]= pnt2x($g_w,p1)
$wx2[i]= pnt2x($g_w,p2)
endif
xd=$wx2[i]-$wx1[i]
if(p1==p2)
m=0
else
m=($g_w[p2]-$g_w[p1])/xd
endif
yb=$g_w[p1]+m*($center[i]-$wx1[i])
$amplitude[i] = y0-yb
AreaKind(what,g_w,g_wx,p1,p2) | outputs V_Area,S_Text
if(what==1) |count
ab=(p2-p1+1)*($g_w[p1]+$g_w[p2])/2
else
ab=xd*($g_w[p1]+$g_w[p2])/2
endif
V_Area-=ab
$area[i]= V_Area
totalArea+=V_Area
FindLevelXY(g_w,g_wx,pc,p1,(y0+$g_w[p1])/2);f1=V_LevelX
FindLevelXY(g_w,g_wx,pc,p2,(y0+$g_w[p2])/2);f2=V_LevelX
$fc[i]=f1
$width[i]=f2-f1
if(mod(i+1,25)==0)
print npks-i,"..."
else
printf "%d...",npks-i
endif
|print i,yb,ab,f1,f2
loop
Printf "\rTotal Area=%8.8g\r",totalArea
ti=(ticks-ti)/60
print ti/npks,"seconds per peak"
DoWindow/F PeakReportTable
if(V_Flag==0)
PeakReportTable()
endif
text+="\r("+S_Text+")"
String cmd="Sort "
if(order==2)
cmd+="/R "
endif
cmd+="$"+srt+",$center,$amplitude,$width,$area,$wx1,$wx2,$fc"
Execute cmd | Sort...
DoWindow/F PeakReportLayout
if(V_Flag==0)
PeakReportLayout()
endif
ReplaceText/N=info text
ReplaceText/N=title "\JC"+title
Modify rows(PeakReportTable)=nrows
End
Macro ZoomToPeak(peak,anno)
Variable peak=ztp_pn,anno=mir_anno
Prompt anno,"area annotation",popup,none+"_one tag on graph_;_one tag per peak_"
Silent 1;PauseUpdate
ztp_pn=peak;mir_anno=anno
WaveStats/Q W_PkCenters
Variable/D npks=V_npnts,x1,x2,xc
DoWindow/F PeakFitGraph
if( (V_Flag==1) %& (peak==limit(peak,0,npks-1)) )
String ex="W_ShowEstWidthsX",ey="W_ShowEstWidthsY",text
x1=W_PkXwL[peak];x2=x1+W_PkFWHMs[peak]
Mk(ex,4);Mk(ey,4);$ex={x1,x1,x2,x2}
x1=W_PkX1[peak];x2=W_PkX2[peak];xc=W_PkCenters[peak];
SetAxis bottom,x1,x2
if(exists(g_wx)==1)
FindPX(g_w,g_wx,x1);x1=pnt2x($g_w,V_PeakP)
FindPX(g_w,g_wx,x2);x2=pnt2x($g_w,V_PeakP)
FindPX(g_w,g_wx,xc);xc=pnt2x($g_w,V_PeakP)
endif
$ey={0,$g_w(x1)+$g_w(xc),$g_w(x2)+$g_w(xc),0};$ey/=2
WaveStats/Q/R=(x1,x2) $g_w
SetAxis left V_min,V_max
AppWv(ey,ex,"");Modify mode($ey)=1
Cursor/P A,$ey,1;Cursor/P B,$ey,2
if(mir_anno!=3)
HideAreaTags()
endif
if(mir_anno!=1)
sprintf text,"\JCpeak %d\rarea=%g\rfwhm=%g",peak,W_PkAreas[peak],W_PkFWHMs[peak]
Tag/C/N=$("area"+num2istr(g_atgn))/A=MC $g_w,xc, text
if(mir_anno==3)
g_atgn+=1
endif
endif
else
Beep;SetAxis/A left;SetAxis/A bottom
endif
End
Proc FindLevelXY(w,wx,s,en,lvl) | requires lvl between w[s] and w[en]
String w,wx
Variable/D s,en,lvl
Variable/D p1,m
V_LevelX=FindLvlX($w,s,en,lvl)
if(exists(wx)==1)
p1=x2pnt($w,V_LevelX-(pnt2x($w,1)-pnt2x($w,0))/2)
m=(V_LevelX-pnt2x($w,p1))/(pnt2x($w,p1+1)-pnt2x($w,p1))
V_LevelX=$wx[p1] + m * ($wx[p1+1] -$wx[p1] )
endif
End
|requires lvl between s and en, else returns NaN
Function/D FindLvlX(w,s,en,lvl)
Wave/D w
Variable s,en |points
Variable/D lvl
if(s==en)
return pnt2x(w,s)
endif
if((w[s]-lvl)*(w[en]-lvl) > 0)
return NaN
endif
Variable sp1,dir=sign(en-s)
Variable/D xpos,d,d1
| update s until s and s+dir bracket lvl
do
d=w[s]-lvl
if(d==0)
return pnt2x(w,s)
endif
sp1=s+dir
d1=w[sp1]-lvl
if(d1==0)
return pnt2x(w,sp1)
endif
if(d*d1<0) | on opposite sides of lvl
xpos=pnt2x(w,s)+(lvl-w[s])*(pnt2x(w,sp1)-pnt2x(w,s))/(w[sp1]-w[s])
break;
endif
s+=dir
while(s!=en) | same side
return xpos
End
Proc AreaKind(kind,w,wx,s,en) | outputs V_Area,S_Text
Variable kind,s,en |type, start,end points
String w,wx
Variable wlx=pnt2x($w,s),wrx=pnt2x($w,en)
if(kind==1)
S_Text="count"
V_Area=(en-s+1)*mean($w,wlx,wrx)
else
if(kind==2)
S_Text="rectangular area"
if(exists(wx)==1)
V_Area=AreaXYRPt($wx,$w,s,en)
else
V_Area=(wrx-wlx)*mean($w,wlx,wrx)
endif
else
S_Text="trapezoidal area"
if(exists(wx)==1)
V_Area=AreaXYTPt($wx,$w,s,en)
else
V_Area=area($w,wlx,wrx)
endif
endif
endif
End
| returns number of knots in kn wave
Function KnotsXYToBase(w,wx,wb,kn)
Wave w,wx,wb,kn
Variable knots=1
Variable p1=PrevNonNaN(kn,numpnts(w)) | right-most
Variable y1=w[p1]
Variable x1=wx[p1]
Variable p2,y2,x2,pt,m
do
p2=p1
p1=PrevNonNaN(kn,p2)
if(p1<0)
break;
endif
y2=y1
x2=x1
y1=w[p1]
x1=wx[p1]
pt=p1
if(x2==x1)
m=0
else
m=(y2-y1)/(x2-x1)
endif
do
wb[pt]=y1+m*(wx[pt]-x1)
pt+=1
while(pt<=p2)
knots+=1
while(1)
return knots
End
| returns number of knots in kn wave
Function KnotsYToBase(w,wb,kn)
Wave w,wb,kn
Variable knots=1
Variable p1=PrevNonNaN(kn,numpnts(w)) | right-most
Variable y1=w[p1]
Variable x1=pnt2x(w,p1)
Variable p2,y2,x2,pt,m
do
p2=p1
p1=PrevNonNaN(kn,p2)
if(p1<0)
break;
endif
y2=y1
x2=x1
y1=w[p1]
x1=pnt2x(w,p1)
pt=p1
m=(y2-y1)/(x2-x1)
do
wb[pt]=y1+m*(pnt2x(w,pt)-x1)
pt+=1
while(pt<=p2)
knots+=1
while(1)
return knots
End
Function PrevNonNaN(w,pt) | returns point number of previous nonNaN value in w
Wave w
Variable pt
do
pt-=1
while((pt>=0) %& (numtype(w[pt])==2))
return pt | returns -1 if last
end
Function NextNonNaN(w,pt) | returns point number of previous nonNaN value in w
Wave w
Variable pt
Variable lim=numpnts(w)
do
pt+=1
while((pt<lim) %& (numtype(w[pt])==2))
return pt | returns numpnts(w) if last
end
Proc XBoxToPBox(bx,w,wx,s,en)
Variable bx,s,en
String w,wx
bx=abs(bx)
if(exists(wx)==1)
bx *= sign($wx[en]-$wx[s])
FindPX(w,wx,bx+$wx[s]);bx=V_peakP
FindPX(w,wx,$wx[s]);bx=abs(V_peakP-bx)
else
bx*=sign(rightx($w)-leftx($w))
bx=x2pnt($w,bx+leftx($w))
endif
Variable/G g_pbox=max(1,bx)
End
Function/D MyBoxSmooth(w,pp,box)
Wave/D w
Variable pp,box | box should be odd
Variable/D result=0
Variable hp,top=numpnts(w)-1,terms
box = 2*trunc(box/2)+1
pp-=trunc(box/2)
hp=limit(0,pp+box-1,top)
pp=limit(0,pp,top)
terms=hp-pp+1
do
result+=w[pp]
pp+=1
while (pp<=hp)
return result/terms
End
Function AreaXYTPt(wx,wy,pa,pb)
Wave wx,wy | monotonic wx!
Variable pa,pb |pa<pb
Variable a=0
do
a+=(wy[pa]+wy[pa+1])*(wx[pa+1]-wx[pa])/2
pa+=1
while(pa<pb)
return a
End
Function AreaXYRPt(wx,wy,pa,pb)
Wave wx,wy | monotonic wx!
Variable pa,pb | pa<pb
Variable a=0
do
a+=wy[pa]*(wx[pa+1]-wx[pa])
pa+=1
while(pa<pb)
return a
End
| W_PM[0]=n, number of functions to fit
| W_PM[1]=start p of peak fit
| W_PM[2]=end p of peak fit
| W_PM[3]=tp, type of baseline
| W_PM[4]=nw, baseline terms, could be 0
| W_PM[5]=tp, type of 1st peak function
|...
| w[0]=NaN
| w[1]=K0
| w[2]=1st coefficient...
Function/D PolyMorph(w,xx)
Wave/D w
Variable/D xx
Variable/D tp,nw, bs=3,n=W_PM[0],st=2,ii,s,r=w[1] | K0
if(n==0)
return r
endif
do
tp=W_PM[bs]
nw=W_PM[bs+1]
if(nw>0)
if(tp<4) | line, poly 3 - poly 5 K1*x+K2*x^2...
ii=nw-1
s=0
do
s=w[ii+st]+xx*s
ii-=1
while (ii >= 0)
r+= s*xx
else
if(tp==8) | gauss
r+=w[st]*exp(-((xx-w[st+1])/w[st+2])^2)
else
if(tp==7) | lor
r+=w[st]/((xx-w[st+1])^2+w[st+2])
else
if(tp==6) | exp
r+= w[st]*exp(-w[st+1]*xx)
else
if(tp==5) | dblexp
r+= w[st]*exp(-w[st+1]*xx)*exp(-w[st+2]*xx)
else | 4, sin
r+= w[st]*sin(w[st+1]*xx+w[st+2])
endif
endif
endif
endif
endif
st+=nw
endif
bs+=2
n-=1
while (n>0)
return r
End
Proc FindPX(w,wx,xx)
String w,wx | wx monotonic
Variable xx
if(exists(wx)==1)
FindLevel/Q $wx, xx
V_peakP = x2pnt($wx,V_levelX)
if(V_Flag==1)
if((xx<$wx[1])%&($wx[0]<$wx[1]))
V_peakP=0
else
V_peakP=numpnts($w)-1
endif
endif
V_peakX = pnt2x($w,V_peakP)
else
V_peakP = x2pnt($w,xx)
V_peakX = xx
endif
End
Proc ChkLen(w1,w2)
String w1,w2 | Wave names
if((exists(w1)==1) %& (exists(w2)==1))
if(numpnts($w1) != numpnts($w2))
Abort w1+" and "+w2+" have different number of points!"
endif
endif
End
Proc Mk(w,n)
String w
Variable n
if(exists(w)==1)
Redimension/D/N=(n) $w;$w=NaN
else
Make/D/N=(n) $w=NaN
endif
End
Proc Dup(t,w)
String t,w
String n=""
if (exists(w)==1)
n=note($w) | keep w's note
endif
Duplicate/O $t,$w
Note/K $w;Note $w,n
End
Proc SameLen(t,w)
String t,w
if(exists(w)!=1)
Duplicate/O $t,$w
else
Redimension/D/N=(numpnts($t)) $w;CopyScales $t,$w
endif
End
Proc NewWv(srcw,sfx)
String srcw,sfx
Variable ii=1
S_Wave=srcw[0,17-strlen(sfx)]+sfx
if(exists(S_Wave)==1)
String shw=S_Wave
do
S_Wave=srcw[0,14-strlen(sfx)]+num2istr(ii)+sfx
ii+=1
while ((exists(S_Wave)==1)*(ii<999))
endif
if(exists(srcw)==1)
Duplicate/O $srcw,$S_Wave
else
Make/D/O $S_Wave
endif
Print "Created wave "+S_Wave
End
Proc RmWv(w)
String w
CheckDisplayed/W=$WinName(0,1) $w
if(V_Flag==1)
DoWindow/F $WinName(0,1);Remove $w
endif
End
Proc KillWv(w)
String w
if(exists(w)==1)
CheckDisplayed/A $w
if(V_Flag==0)
KillWaves $w
endif
endif
End
Proc AppCrs(w)
String w
ShowInfo;Cursor/P A,$w,0;Cursor/P B,$w,numpnts($w)-1
End
Proc NoCrs()
HideInfo;Cursor/K A;Cursor/K B
End
Proc AppWv(w,wx,ax)
String w,wx,ax
String wn=WinName(0,1)
if(strlen(wn)==0)
ax = "Display $w"
else
DoWindow/F $wn
ax="Append"+ax+" $w "
endif
if(exists(w)==1)
CheckDisplayed $w
if(V_Flag==0)
if(exists(wx)==1)
ax+=" vs $wx"
endif
Execute ax
ColorWaves()
endif
endif
End
Proc SBs(s)
String s
if((exists(s)==1)%|(cmpstr(s+";",none)==0))
g_b=s;rb_b=s;fpks_b=s;afp_b=s
else
if(strsearch(S_funcs,s,0)>=0)
fpks_b=s
else
if(cmpstr(s,"_From Fit Peaks_")==0)
rb_b=s;afp_b=s
else
if(cmpstr(s,"_From Fit Baseline_")==0)
fpks_b=s
endif
endif
endif
endif
End
Macro ShowOnlyDataAndBase()
Silent 1;PauseUpdate
String keep=g_w+";"+g_wx+";"
keep+=g_b+";"+WaveList("*X",";","WIN:"+WinName(0,1))
keep+=g_keep+";";g_keep=""
String w,wn=WinName(0,1),ws=WaveList("*",";","WIN:"+wn)
Variable pos,flg=0
if(strlen(wn)!=0)
do
pos=strsearch(ws,";",0)
if(pos<0)
break
endif
w=ws[0,pos-1]
ws[0,pos]=""
if(strsearch(keep,w+";",0)<0)
RmWv(w);flg=1
endif
while (1)
if(flg)
ColorWaves()
endif
endif
End
Macro ColorWaves() : GraphStyle
Silent 1;PauseUpdate
Modify/Z rgb[0]=(65535,0,0)
Modify/Z rgb[1]=(0,0,65535),rgb[2]=(3009,65535,1882),rgb[3]=(0,0,0)
Modify/Z rgb[4]=(0,0,65535),rgb[5]=(63953,3661,65535)
Modify/Z rgb[6]=(37510,1,1),rgb[7]=(27232,40528,22540),rgb[8]=(1531,1314,28456)
Legend/C/N=default ""
End
Proc CheckTwoCursors(w)
String w | the y wave
Variable/G V_start,V_theEnd,V_startX,V_theEndX | point indices, x vals
String wa=CsrWave(A),wb=CsrWave(B),t="cursors on target graph "
if((strlen(wa)==0)%|(strlen(wb)==0))
Abort "expecting two "+t
endif
V_start=pcsr(A);V_theEnd=pcsr(B)
V_startX=hcsr(A);V_theEndX=hcsr(B)
Variable x0=pnt2x($w,0),x1=pnt2x($w,1),ok
ok = (numpnts($wa)==numpnts($w)) %& (numpnts($wb)==numpnts($w))
ok = ok %& (x0==pnt2x($wa,0)) %& (x1==pnt2x($wa,1))
ok = ok %& (x0==pnt2x($wb,0)) %& (x1==pnt2x($wb,1))
if(ok)
if(V_start>V_theEnd)
x0=V_Start
V_start=V_theEnd
V_theEnd=x0
x0=V_startX
V_startX=V_theEndX
V_theEndX=x0
endif
| if(V_start==V_theEnd)
| Abort t+"are too close together!"
| endif
else
Abort t+"must be on wave "+w+" or one like it"
endif
End
Window PeakReportTable() : Table
PauseUpdate; Silent 1 | building window...
Edit /W=(14,46,545,227) W_PkCenters.y,W_PkAmps.y,W_PkFWHMs.y as "PeakReportTable"
Append W_PkAreas.y,W_PkX1.y,W_PkX2.y,W_PkXwL.y
Modify size=9
Modify width(Point)=38
Modify width(W_PkCenters.y)=46
Modify width(W_PkAmps.y)=72
Modify width(W_PkFWHMs.y)=78
Modify width(W_PkAreas.y)=72
Modify width(W_PkX1.y)=50
Modify width(W_PkX2.y)=52
Modify width(W_PkXwL.y)=94
EndMacro
Window PeakReportLayout() : Layout
PauseUpdate; Silent 1 | building window...
Layout /W=(18,45,536,265) PeakReportTable(49,190,553,310)/O=2 as "Peak Report Layout"
Textbox /N=title/A=LT/X=18.5455/Y=2.06044 "\JCYour Report Title Here"
Modify left(title)=133,top(title)=47,width(title)=105,height(title)=4,frame(title)=4
Textbox /N=info/A=LT/X=63.8182/Y=0.961538 "7 peaks\r(trapezoidal area)"
Modify left(info)=382,top(info)=39,width(info)=83,height(info)=18,frame(info)=1
Append PeakFitGraph(43,64,555,183)/O=1
EndMacro
Window PeakEstimates() : Table
Edit /W=(35,87,576,268) W_EstCentersP.y,W_EstCentersX.y,W_EstAmpsY.y as "Peak Estimates"
Append W_EstWidthsX.y,W_EstEdgesP.y
Modify width=98,width(Point)=64
EndMacro
Window AreaReportTable() : Table
Edit /W=(59,222,420,347) W_AreaX1.y,W_AreaX2.y,W_AreaNoBase.y as "Areas Between Cursors"
Modify width(Point)=64
Modify width(W_AreaNoBase.y)=112
EndMacro